package com.vic.publishconfirm.controller;

import com.vic.publishconfirm.config.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 发布确认生产者
 */
@Slf4j
@RestController
@RequestMapping("producer1")
public class Producer1Controller {

    @Autowired
    RabbitTemplate rabbitTemplate;

    /**
     * 测试2种情况：
     * 1) 正确交换机，正确路由键。在 MyConfirmCallback 中 ack 为 true。
     * 2) 错误交换机，正确路由键。在 MyConfirmCallback 中 ack 为 false，cause 为错误原因。
     * @param message
     */
    @GetMapping("/confirm1/sendMsg/{message}")
    public void sendMsg1(@PathVariable String message) {
        // 设置消息唯一id
        CorrelationData correlationData1 = new CorrelationData("1");
        // 使用正确的交换机发送消息（该消息能正确的发布到交换机）
        rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_EXCHANGE, ConfirmConfig.CONFIRM_ROUTING_KEY, message, correlationData1);
        log.info("使用正确的交换机发布消息，发送的消息是: {}", message);

        // 设置消息唯一id
        CorrelationData correlationData2 = new CorrelationData("2");
        // 使用错误的交换机发送消息（该消息不会发布到交换机）
        rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_ERROR_EXCHANGE, ConfirmConfig.CONFIRM_ROUTING_KEY, message, correlationData2);
        log.info("使用错误的交换机发布消息，发送的消息是: {}", message);
    }

    /**
     * 测试2种情况：
     * 1) 正确交换机，正确路由键。在 MyConfirmCallback 中 ack 为 true。
     * 2) 正确交换机，错误路由键。在 MyConfirmCallback 中 ack 为 true，但实际没有将消息路由到队列。使用消息回退机制。
     * @param message
     */
    @GetMapping("/confirm2/sendMsg/{message}")
    public void sendMsg2(@PathVariable String message) {
        // 设置消息唯一id
        CorrelationData correlationData1 = new CorrelationData("1");
        // 使用相同交换机，正确的 routing_key 发送消息
        rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_EXCHANGE, ConfirmConfig.CONFIRM_ROUTING_KEY, message, correlationData1);
        log.info("使用相同交换机，正确的 routing_key 发送消息，发送的消息是: {}", message);

        // 设置消息唯一id
        CorrelationData correlationData2 = new CorrelationData("2");
        // 使用相同交换机，错误的 routing_key 发送消息
        rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_EXCHANGE, ConfirmConfig.CONFIRM_ERROR_ROUTING_KEY, message, correlationData2);
        log.info("使用相同交换机，错误的 routing_key 发送消息，发送的消息是: {}", message);
    }

}
